package com.zeta.system.poi.convert;

import cn.hutool.core.util.EnumUtil;
import cn.idev.excel.converters.Converter;
import cn.idev.excel.enums.CellDataTypeEnum;
import cn.idev.excel.metadata.GlobalConfiguration;
import cn.idev.excel.metadata.data.ReadCellData;
import cn.idev.excel.metadata.data.WriteCellData;
import cn.idev.excel.metadata.property.ExcelContentProperty;
import com.zeta.system.model.enums.SexEnum;

/**
 * Excel中的 性别转换
 * <p>
 * 说明：
 * <pre>
 * 1.特殊需求
 * 2.后端存储的是数字，导出Excel时需要将数字1转换成“男”，2转换成“女”
 * 3.导入Excel时，需要将“男”转换成1，“女”转换成2
 * </pre>
 * @author gcc
 */
public class SexConverter implements Converter<Integer> {

    /**
     * 返回 Java 中的对象类型
     *
     * @return Support for Java class
     */
    @Override
    public Class<?> supportJavaTypeKey() {
        return Integer.class;
    }

    /**
     * 返回 excel 中的对象枚举
     *
     * @return Support for {@link CellDataTypeEnum}
     */
    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }

    /**
     * 将 excel 对象转换为 Java 对象
     *
     * @param cellData            Excel 单元格数据。不为空
     * @param contentProperty     上下文属性。可空
     * @param globalConfiguration 全局配置。不为空
     * @return 要放入 Java 对象的数据
     * @throws Exception Exception.
     */
    @Override
    public Integer convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        // 判断是否是字符串类型
        if (!CellDataTypeEnum.STRING.equals(cellData.getType())) {
            return null;
        }

        // 通过读取到的“男“、”女“,取到对应的枚举
        SexEnum sex = EnumUtil.getBy(SexEnum::getMsg, cellData.getStringValue());

        // 返回枚举的code，存入到java类对应的字段中去
        return sex == null ? 0 : sex.getCode();
    }

    /**
     * 将 Java 对象转换为 excel 对象
     *
     * @param value               Java 数据。不为空
     * @param contentProperty     上下文属性。可空
     * @param globalConfiguration 全局配置。不为空
     * @return 要放入 Excel 的数据
     * @throws Exception Exception.
     */
    @Override
    public WriteCellData<?> convertToExcelData(Integer value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        if (value == null) { return new WriteCellData<>(); }

        // 通过读取到java字段的值1、2。取到对应的枚举
        SexEnum sex = EnumUtil.getBy(SexEnum::getCode, value);
        // 返回枚举的msg，写入到excel中
        return sex == null ? new WriteCellData<>() : new WriteCellData<>(sex.getMsg());
    }
}
